3.6.1.14 x,y-行列レジスタ
行列レジスタオペランドの文法は次の通りである。
code:txt
$(l|ll)(x|y)<addr> # (1)write or transposed read
|$l(x|y) # (2)matvec
(1)は行列レジスタ書き込み(3.6.10 行列レジスタ書き込み命令式)および転置読み出し(3.6.1.18 mreadf-行列レジスタ転置読み出しフォワーディング)
(2)は行列ベクトル積演算実行(3.6.9 MAU命令式)のときの文法である。
(l|ll)はアクセス語長指定である。
lが長語、llが 2 長語となる。
アクセス語長を 2 長語にできるのは(1)でオペコードの精度指定が半精度の場合(すなわちhmwriteかhmread)のみで、かつ半精度転置読み出しの場合(hmread)では 2 長語にしなければならない。
(x|y)は 2 面ある行列レジスタのどちらにアクセスするかを指定する。
<addr>は書き込みにおいては行番号、転置読み出しにおいては列番号である。
(2)においては行列レジスタの 1 面全体が使われるのでアドレス指定はない。
LMなどのPEメモリと違いアドレスインクリメントを指定できず、連続する行(列)を重複なくアクセスするように語長に合わせて各サイクルでインクリメントされる。
行番号(列番号)が精度ごとの行数(列数)を超える場合はラップアラウンドする。
行番号(列番号)は各サイクルでアクセス語長にアラインしていないとならない。
すなわち、 2 長語アクセスの場合はは 2 の倍数になっていないとならない。
行列ベクトル積和演算は行列レジスタに書き込んだ直後のステップから実行可能である。
行列レジスタは精度ごとに実体があるわけではなく、また書き込んだ精度の情報は記憶していない。
書き込みと読み出しで精度が一貫していなかった場合の動作は未定義動作である。